#define _GNU_SOURCE // 申明可以使用扩展语法
#include "pthread.h"
#include <stdio.h>
#include "unistd.h"
#include "mqueue.h"
#include "string.h"

static char *mq_name = "/my_mq";
static mqd_t mq_fd;

// first线程函数
void *first_thread_fun(void *arg)   // 发送消息
{
    printf("first线程函数执行！准备发消息\n");
    char *msg = "hello";
    mq_send(mq_fd, msg, strlen(msg) + 1, 0);
    printf("first线程发送消息完成！\n");
}

// second线程函数
void *second_thread_fun(void *arg)  // 接收消息
{
    printf("second线程函数执行！准备收消息\n");
    char msg[100];
    ssize_t len = mq_receive(mq_fd, msg, 100, NULL);
    printf("second线程接收到消息，消息是：%s\n 长度是%ld\n", msg, len);
}

int main()
{
    // 创建消息队列
    struct mq_attr attr;
    // 消息队列最大的消息数量
    attr.mq_maxmsg = 10;
    // 每个消息的最大字节数
    attr.mq_msgsize = 100;
    mq_fd = mq_open(mq_name, O_CREAT | O_RDWR, 0666, &attr);
    // 判断是否创建成功
    if (mq_fd == -1)
    {
        printf("消息队列创建失败！\n");
        return -1;
    }
    

    // 开始执行主线程
    printf("main函数线程开始执行！\n");
    // 创建线程
    pthread_t pt1, pt2;
    pthread_create(&pt1, NULL, first_thread_fun, NULL);
    pthread_create(&pt2, NULL, second_thread_fun, NULL);
    printf("main线程函数继续执行！\n");

    // 等待线程执行结束
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    // 关闭消息队列、销毁消息队列
    mq_close(mq_fd);
    mq_unlink(mq_name);

    printf("主线程执行完毕！\n");

    return 0;
}